var store_organizacion;
var store_cuenta;
var store_panel;
var store_egresos;
var c=0;

Ext.onReady(function()
{
    store_organizacion = new X.store.Json({
        fields : [
            'codigoOrganizacion',
            'razonSocial'
        ]
    });


    store_tipo = new X.store.Json({
        fields : [
            'codigoDocumento',
            'nombreDocumento'
        ]
    });


    store_cuenta = new X.store.Json({
        fields : [
            'codigoCuenta',
            'nombreRubro',
            'codigo',
            'codigoNombre'
        ]
    });

    store_cuenta.addListener('load', function(store, records, options){
        for(var i=0; i<store.getCount(); i++){
            var record = store.getAt(i);
            record.set('codigoNombre', record.get('codigo') + ' ' + record.get('nombreRubro'));
        }
    });

   store_egresos = new X.store.Json({
        url : '/solicitudpg/ajax-egresos',
        fields : [
            'codigoComprobante',
            'numeroComprobante',
            'codigoMovimiento',
            'fechaMovimiento',
            'cantidad',
            'concepto',
            'monto',
            'observaciones',
            'codigoCuenta',
            'codigo',
            'nombreRubro',
            'razonSocial',
            'codigoNombre',
            'codigoOrganizacion',
            'codigoDocumento'
        ]
    });

    store_egresos.addListener('load', function(store, records, options){
    for(var i=0; i<store.getCount(); i++){
           var record = store.getAt(i);
           record.set('codigoNombre', record.get('codigo') + ' ' + record.get('nombreRubro'));
       }
    });

    store_panel = new X.store.Json({
        fields : [
            'codigoComprobante',
            'numeroComprobante',
            'codigoMovimiento',
            'fechaMovimiento',
            'cantidad',
            'concepto',
            'monto',
            'observaciones',
            'codigoCuenta',
            'codigo',
            'nombreRubro',
            'razonSocial',
            'codigoNombre',
            'codigoOrganizacion',
            'codigoDocumento'
        ]
    });

    store_panel.addListener('load', function(store, records, options){
    for(var i=0; i<store.getCount(); i++){
           var record = store.getAt(i);
           record.set('codigoNombre', record.get('codigo') + ' ' + record.get('nombreRubro'));
       }
    });

     var combo_rubro = new X.field.Combo ({
        valueField   : 'codigoCuenta',
        displayField : 'codigoNombre',
        width        : 230,
        store        : store_cuenta,
        editable     : true
    });
    var combo_organizacion = new X.field.Combo ({
        id           : 'organizacion',
        fieldLabel   : 'Proveedor',
        hiddenName   : 'codigoOrganizacion',
        valueField   : 'codigoOrganizacion',
        displayField : 'razonSocial',
        width        : 230,
        store        : store_organizacion,
        allowBlank   : true
    });

     var combo_tipo = new X.field.Combo ({
        id           : 'tipo',
        fieldLabel   : 'Tipo',
        hiddenName   : 'codigoDocumento',
        valueField   : 'codigoDocumento',
        displayField : 'nombreDocumento',
        width        : 230,
        store        : store_tipo,
        allowBlank   : true
    });
    
    var grid = new X.grid.GridEditor({

        id        : 'grid',
        height    : 270,
        width     : 1100,
        store     : store_panel,
        useBbar  : false,
        useTbar  : false,

        sm: new Ext.grid.RowSelectionModel({singleSelect:true}),
        columns:[
            new X.column.Date  ({header: 'Fecha',          dataIndex: 'fechaMovimiento',   width: 85 ,editor: new X.field.Date({
                    listeners:{
                    change:function(field, newv, oldv){
                        if (newv.getYear() != oldv.getYear()){
                            X.msg.Failure('No se permite modificar el año.');
                            field.setValue(oldv);
                        }
                    }
                }
            })}),
            new X.column.Number({header: 'N° comprobante', dataIndex: 'numeroComprobante', width: 100, editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Combo ({header: 'Tipo',           dataIndex: 'codigoDocumento',   width: 70,  editor: combo_tipo  }),
            new X.column.Combo ({header: 'Proveedor',      dataIndex: 'codigoOrganizacion',width: 110, editor:combo_organizacion}),
            new X.column.Combo ({header: 'Rubro',          dataIndex: 'codigoCuenta',      width: 212, editor:combo_rubro}),
            new X.column.Text  ({header: 'Concepto',       dataIndex: 'concepto',          width: 140, editor: new X.field.Text()}),
            new X.column.Text  ({header: 'Observaciones',  dataIndex: 'observaciones',     width: 140, editor: new X.field.Text()}),
            new X.column.Number({header: 'Cantidad',       dataIndex: 'cantidad',          width: 90,  editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Money ({header: 'Monto',          dataIndex: 'monto',             width: 100, editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
        ],
        tbar      : [{
            text: 'Asignar egresos',
            icon:'/img/icon_agregar.png',
            handler : function(){
                if(c==0){ load_egresos_from_panel(); c++ }
                else{
                   if (store_panel.getCount()!=0) asignar_egresos();
                }

                egresos.setVisible(true);win.show()
            }},
            {text:'Eliminar seleccionado (permanente)', icon:'/img/icon_eliminar.png', handler:function(){
                    if ( grid.getSelectionModel().getCount() == 1){
                        eliminar_seleccionado(
                            grid.getSelectionModel().getSelected().get('codigoMovimiento')
                        );
                    }
            }}
        ]
    });

    grid.getStore().remoteSort=false;

  var form=  new X.form.FormPanel({

        title            : 'Editar Orden de Pago',
        submitButtonText : 'Guardar',
        returnButtonText : 'Cancelar',
        submitUrl        : '/solicitudpg/ajax-editar',
        returnUrl        : '/solicitudpg/listar',
        width            : 1130,
        height           : 530,
        labelWidth       : 120,
        layout           : 'absolute',

        items:[
            new Ext.form.FieldSet({title:'Solicitud', x: 10, y: 5, width: 410, height: 150, items:
            [
                new X.field.Hidden({id:'codigoSolicitud'}),
                new X.field.Hidden({id:'gridRows'}),
                new X.field.Text({fieldLabel:'Nro. Solicitud',        id:'nroSolicitud',     width:230, readOnly: true}),
                new X.field.Date({fieldLabel:'Fecha',                 id:'fechaSolicitud', width:230,
                     listeners:{
                        change:function(field, newv, oldv){
                            if (newv.getFullYear() == oldv.getFullYear()) return;
                            X.msg.Failure('No puede cambiar el año de la solicitud.');
                            Ext.getCmp('fechaSolicitud').setValue(oldv);
                        }
                     }
                }),
                new X.field.Text({fieldLabel:'Orden de pago',         id:'ordenPago',     width:230, allowBlank: true}),
                new X.field.Number({fieldLabel:'Monto Total',         id:'monto',          width:230, readOnly: true})
            ]}),
            new Ext.form.FieldSet({title:'Detalles', x: 500, y: 5, width: 600, height: 150,items:
            [
                new X.field.Area({fieldLabel:'Concepto',      id:'concepto',      width:420, height: 40, allowBlank: true}),
                new X.field.Area({fieldLabel:'Justificación', id:'justificacion', width:420, height: 40, allowBlank: true})
     
            ]}),
            new Ext.form.FieldSet({title:'Detalle de Egresos', x: 10, y: 170,items:
            [
                grid
            ]})
        ]
    });
    
    var sm = new Ext.grid.CheckboxSelectionModel();

    var egresos = new X.grid.GridEditor({

        id       : 'egresos',
        title    : 'Lista de Egresos de Monto Mayor',
        height   : 460,
        width    : 1075,
        store    : store_egresos,
        useBbar  : false,
        useTbar  : false,

        columns:[
            new X.column.Date  ({header: 'Fecha',          dataIndex: 'fechaMovimiento',   width: 85, editable:false}),
            new X.column.Number({header: 'N° comprobante', dataIndex: 'numeroComprobante', width: 100, editable:false}),
            new X.column.Combo ({header: 'Tipo',           dataIndex: 'codigoDocumento',   width: 70,  editor: combo_tipo  ,editable:false}),
            new X.column.Combo ({header: 'Proveedor',      dataIndex: 'codigoOrganizacion',width: 110, editor:combo_organizacion,editable:false}),
            new X.column.Combo ({header: 'Rubro',          dataIndex: 'codigoCuenta',      width: 212, editor:combo_rubro,editable:false}),
            new X.column.Text  ({header: 'Concepto',       dataIndex: 'concepto',          width: 140,editable:false}),
            new X.column.Text  ({header: 'Observaciones',  dataIndex: 'observaciones',     width: 140,editable:false}),
            new X.column.Number({header: 'Cantidad',       dataIndex: 'cantidad',          width: 90,editable:false}),
            new X.column.Money ({header: 'Monto',          dataIndex: 'monto',             width: 100,editable:false}),
            sm
        ],
        sm :sm,
        buttons: [ {text:'Aceptar', handler:Aceptar, ref: '../AceptarButton'},
                   {text:'Cancelar', handler:Cancelar}
                 ],
        buttonAlign:'center'

    });

    egresos.setVisible(false);
    egresos.getStore().remoteSort=false;

    var win = new Ext.Window({
        resizable: false,
        closeAction: 'hide',
        items: [egresos]
    });

    function Aceptar(){
        var array= new Array();
        array = sm.getSelections();
        store_panel.removeAll();
        sum=0;
        for (var i=0;i<array.length;i++)
        {
             store_panel.add(array[i]);
             sum += parseInt( array[i].get('monto') );
        }
        Ext.getCmp('monto').setValue(sum);
        win.hide();

    }

     function Cancelar(){
        win.hide();
    }

    

     //se carga el store de la lista de egresos con una marca de seleccion
     function load_egresos_from_panel(){
        var rec;
        var array= new Array();
        for (var i=0;i<store_panel.getCount();i++){
            rec = store_panel.getAt(i);
            store_egresos.add(rec);
            array[i]= store_egresos.getCount()-1;
        }
        sm.selectRows(array);
     }

     function asignar_egresos(){
         var array= new Array();
         for (var i=0,k=0;i<store_panel.getCount();i++){
            rec = store_panel.getAt(i);
            cod = rec.get('codigoMovimiento');
            for (var j=0;j<store_egresos.getCount();j++){
                 rec = store_egresos.getAt(j);
                 if (cod == rec.get('codigoMovimiento')){
                     array[k]=j; k++;
                 }
            }
        }
        sm.selectRows(array);
    }

       // form invisible para hacer el submit de eliminar el movimiento
    var formSubmitEliminar = new Ext.form.FormPanel({
        renderTo : 'layout_content',
        hidden   : true
    });

    function eliminar_seleccionado(idSeleccionado){

        store_panel.idSeleccionado = idSeleccionado;

        formSubmitEliminar.getForm().submit({
            url       : '/egresomm/ajax-eliminar',
            waitTitle : 'Aguarde un momento.',
            waitMsg   : 'Eliminando el movimiento seleccionado...',
            params    : {
                id : idSeleccionado
            },
            success : function(form, action){
                try{
                    X.msg.Success(action.result.msg);

                    for (var i=0; i<store_panel.getCount(); i++){
                        if (store_panel.getAt(i).get('codigoMovimiento') == store_panel.idSeleccionado){
                            store_panel.removeAt(i);
                            actualizar_monto_total();
                            break;
                        }
                    }
                }
                catch(e){X.msg.FailureJs(e.message);}
            },
            failure : function(form, action){
                try{
                    if (action.failureType === Ext.form.Action.SERVER_INVALID){
                        X.msg.Failure(action.result.msg);
                    }
                    else X.msg.Failure('respuesta inválida del servidor');
                }
                catch(e){X.msg.FailureJs(e.message);}
            }
        });
    }

     function actualizar_monto_total(){
        try{
            var sum = 0;
            var record;
            for (var i=0; i< store_panel.getCount(); i++){
                record = store_panel.getAt(i);
                sum += parseInt( record.get('monto') );
            }
            Ext.getCmp('monto').setValue(sum);
        }
        catch(e){
            X.msg.FailureJs(e.message);
        }
    }

    // actualizar los datos del comprobante para otros movimientos
    grid.addListener('afteredit', function(e){
        if (e.field == 'numeroComprobante'  ||
            e.field == 'fechaMovimiento'    ||
            e.field == 'codigoOrganizacion' ||
            e.field == 'codigoDocumento'    ){
            for (var i=0; i<store_panel.getCount(); i++){
                var r = store_panel.getAt(i);
                if ((e.field == 'numeroComprobante' && r.get('numeroComprobante') == e.originalValue                  ) ||
                    (e.field != 'numeroComprobante' && r.get('numeroComprobante') == e.record.get('numeroComprobante')) ){
                    r.set(e.field, e.value);
                    r.commit();
                }
            }
        }
        e.record.commit();
        actualizar_monto_total();
    });

     form.getForm().addListener('beforeaction', function(form, action){
        if (Ext.isEmpty(Ext.getCmp('fechaSolicitud').getValue())){
            X.msg.Failure('Complete con una "Fecha"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('ordenPago').getValue())){
            X.msg.Failure('Complete el campo "Orden de pago"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('concepto').getValue())){
            X.msg.Failure('Complete el campo "Concepto"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('justificacion').getValue())){
            X.msg.Failure('Complete el campo "Justificacion"'); return false;
        }
        if (store_panel.getCount() <= 0){
            X.msg.Failure('Agregue al menos un movimiento'); return false;
        }
        for (var i=0; i<store_panel.getCount(); i++){
            var record = store_panel.getAt(i);
            if (Ext.isEmpty(record.get('fechaMovimiento'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Fecha" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('numeroComprobante'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Nº comprobante" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoDocumento'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Tipo" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoOrganizacion'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Proveedor" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoCuenta'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Rubro" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('concepto'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Concepto" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('observaciones'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Observaciones" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('cantidad'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Cantidad" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('monto'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Monto" incompleto'); return false;
            }
        }
        return true;
    });
     
});

